K8s 用戶需要很了解所用到的網路儲存系統的配置細節才能完成Volume配置, 由於要研究的配置很多, 所以K8s設計了Persistent Volume來將儲存系統和管理解耦, 它是位於用戶和管理員之間的抽象層。
Persistent Volume(PV)是由管理員配置在儲存系統上的一段儲存空間, 它將共享儲存數據做為一種可由用戶申請使用的資源, 實現“儲存消費”的機制, 用戶要對PersistentVolumeClaim(PVC)提出申請使用PV的請求, PVC會向PV申請特定大小的空間和訪問模式再創建出PVC Volume, 最後再由Pod 通過PVC做關聯。
spec字段:
Retain
, Recycle
, Delete
, 預設Retain
NFS
, hostPath
支援Filesystem
空
, 不屬於任何StorageClass。各類型PV支持的訪問模式可參考官網
YAML 部署
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-001
lables:
release: stable
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistenVolumeRecliamPolicy: Recycle
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: "/webdata/htdocs"
server: nfs.ilinux.io
查看結果
-> % kubectl get pv pv-nfs-001
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs-001 5Gi RWX Retain Available slow
STATUS
會有幾種結果:
Available
: 可用狀態的自由資源, 尚未被PVC綁定Bound
: 已經綁定到某個PVCReleased
: 綁定的PVC已被刪除, 但資源尚未被回收Failed
: 自動回收資源失敗而處於故障狀態PVC和PV是一對一的關係, 它透過用戶申請要佔用某個PV而創建
spec字段包含:
accessMode
: PVC的訪問模式, 可用模式同PVresources
: volume需要的最小資源設定selector
: 綁定PV要使用的標籤選擇器(matchLabels)或正則式(matchExpressions)storageClassName
: 所屬的StorageClass名稱volumeMode
: 指定volume可被當作文件系統使用或只能使用原本的區塊設備, 預設Filesystem
volumeName
: 指定要綁定的PV名稱YAML 部署
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-001
labels:
release: stable
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
resources:
requests:
storage: 5Gi
storageClassName: slow
selector:
matchLabels:
release: stable
查看結果
-> % kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs-001 Pending slow 72s
綁定PVC之後, Pod就可以使用到PV的數據, Pod引用PVC時只能使用同一個Namespace的資源。
在Pod中使用PVC
pod spec 加上兩個字段即可使用PVC
1.claimName
: 要調用的PVC名稱
2.readOnly
: 是否將volume強制掛載成唯讀模式, 預設false
YAML範例
apiVersion: v1
kind: Pod
metadata:
name: pod-nfs
spec:
containers:
- name: redis
image: redis:4-apline
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /data
name: redis-1
volumes:
- name: redis-1
persistentVolumeClaim:
claimName: pv-nfs-001
StorageClass 是為了讓管理員方便管理PV和PVC所創建出來的類別, 管理員可按照性能高低分類或是根據備份策略分類。StorageClass可以支援PV動態創建,提高PV運用的靈活性。
metadate.name
。provisioner
: 提供儲存資源的系統, 用在將儲存插件調用到目標儲存系統, k8s內建的都以kubernetes.io
為前綴, 也開放用戶依據規範自行定義parameters
: 描述要關聯的Volume的參數reclaimPolicy
: 指定動態創建的PV回收策略, 可用Delete和Retain, 預設Retain
volumeBindingMode
: 定義如何為PVC完成供給與綁定, 預設VolumeBindingImmediate
; 此設定只在啟用Volume調度功能才生效mountOptions
: 動態創建的PV掛載選項列表Provisioning:
Provisioning 是指為PVC準備可用的PV的機制。K8s提供兩個機制:靜態供給和動態供給。
Binding:
用戶定義好PVC之後, k8s會為其查找匹配的PV建立兩邊的關聯, 再把兩邊的狀態調整為"Binding"。如果PVC一直無法找到匹配的PV, 則狀態會是"unbound"
Reclaiming
Volume完成任務後即可刪除PVC回收資源, 回收策略取決於PV的定義:"Retained", "Recycled" ,"Deleted"。
Resizing
安裝好PersistentVolumeClaimResize
插件之後才能使用PVC擴展機制, 在支援擴展PVC的Volume部署spec時將allowVolumeExpansion
設置為true
即可動態擴展Volume空間
今天先到這裡了, 明天會來讀常用的ConfigMap 和 Secret, 他們也是Volume的一種!